<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /* 什么是原型  
            构造函数也是函数  
            每个函数天生自带一个属性  prototype 是一个对象的数据结构 
            // arguments  
            // classList
            // dataSet

            每个对象 天生自带一个属性  __proto__ ,
            这个属性指向 所属构造函数的 prototype(原型 )
            //当我们访问一个对象的属性 和方法的时候  首先看看对象身上有没有  
            // 如果有直接输出 停止查找
            // 如果没有  就到对象自己的__proto__上找  
            这个__proto__指向所属构造函数的原型 
        
        */

        function Person(name){
            this.name = name;  // 属性写在构造函数内部  
            
        }
        // 方法写在构造函数的原型上  
        Person.prototype.sayHello = function(){
            console.log('hello world');
        }

        console.log(Person.prototype)

        //上面  我们 就是 构造函数的属性写在内部  方法写在构造函数的原型上 


        var p1 =  new Person('张三');
        console.log(p1.name);


        // 张三自己身上有 name 属性  所以 直接输出  
        // p1.sayHello(); // 构造函数内部没有写 sayHello // 我们把sayHello写在了
        // 构造函数的原型上  

        // 为什么对象可以直接用sayHello;

        // p1身上没有这个方法 它就到自己的__proto__上找 
        // __proto__指向所属构造函数的原型  原型上有sayHello这个方法 
        // 所以 p1可以直接用这个方法 
        
        console.log(p1.__proto__ === Person.prototype);

        //true


    </script>
</body>
</html>